package com.lachesis.molecule.web.spring;

import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
/** 
 * @ClassName: SpringContextContainer 
 * @Description: 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. 
 * @author shiwei.hu shiwei.hu@lachesis-mh.com
 * @date 2017年10月31日 下午7:42:42 
 *  
 */
public class SpringContextContainer implements ApplicationContextAware { 

	/** 
	 * @Fields LOG : 日志器 
	 */ 
	private static Logger LOG = Logger.getLogger(ApplicationContextAware.class); 

	/** 
	 * @Fields applicationContext : 应用内容上下文 
	 */ 
	private static ApplicationContext applicationContext;

	
	public void setApplicationContext(ApplicationContext applicationContext) { 
		SpringContextContainer.applicationContext = applicationContext;	// NOSONAR 
	} 

	public static ApplicationContext getApplicationContext() { 

		if(checkApplicationContext())
			return applicationContext;
		
		return null;
	} 

	/** 
	 * @Title: getBean 
	 * @Description: 从静态变量ApplicationContext中通过Id取得Bean, 自动转型为所赋值对象的类型.
	 * @param beanId 获取的Bean名称
	 * @return    返回Bean实例，如果获取失败返回空 
	 * @return T    返回类型 
	 * @throws 
	 */
	@SuppressWarnings("unchecked") 
	public static <T> T getBean(String beanId) { 

		if(checkApplicationContext()) 
			return (T) applicationContext.getBean(beanId);
		return null;
	} 


	/** 
	 * @Title: getBean 
	 * @Description: 从静态变量ApplicationContext中通过类型取得Bean, 自动转型为所赋值对象的类型.
	 * @param clazz 获取的Bean类型
	 * @return    返回Bean实例，如果获取失败返回空
	 * @return Map<String,T>    返回类型 
	 * @throws 
	 */
	public static <T> Map<String, T> getBean(Class<T> clazz) {

		if(checkApplicationContext()) 
			return (Map<String, T>) applicationContext.getBeansOfType(clazz);
		return null;
	} 

	/** 
	 * @Title: cleanApplicationContext 
	 * @Description: 清除applicationContext静态变量. 
	 * @return void    返回类型 
	 * @throws 
	 */
	public static void cleanApplicationContext() { 
		applicationContext = null; 
	} 

	/** 
	 * @Title: checkApplicationContext 
	 * @Description: 判断ApplicationContext是否在Spring配置文件中声音，如果未声音打印相关日志
	 * @return    设定文件 
	 * @return boolean    返回类型 
	 * @throws 
	 */
	private static boolean checkApplicationContext() { 

		if (applicationContext == null) { 
			LOG.error("ApplicaitonContext未注入， 请在Spring配制文件中加入SpringContextContainer的Bean定义");
		} 

		return applicationContext != null;
	} 
}